(function () {
   // 定义一个Animal类
   class Animal {
      name: string;
      age: number;
      constructor(name: string, age: number) {
         this.name = name;
         this.age = age;
      }
      sayHello() {
         console.log('动物在叫~');
      }
   }

   // 定义一个表示狗的类
   /**
    * -使用继承后，子类将会拥有父类所有的方法和属性
    * -通过继承可以将多个类中共有的代码写在一个父类中，
    * -这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法
    * -如果在子类中添加了和父类相同的方法，则子类方法会覆盖掉父类的方法
    * -这种子类覆盖掉父类方法的形式，我们称为方法重写
    */
   class Dog extends Animal {
      sayHello() {
         console.log('~汪汪');
      }
      run() {
         console.log(`${this.name}再跑`);

      }
   }

   // 定义一个表示猫的类
   class Cat extends Animal {
      sayHello() {
         console.log('喵喵喵喵！');
      }
   }

   let dog = new Dog('旺财', 4)
   console.log(dog);
   dog.run()

   const cat = new Cat('咪咪', 3);
   console.log(cat);
   cat.sayHello();

})()